www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第12章 常微分方程(组)数值求解/examp12_4_2.m

    function examp12_4_2
y01 = [1;0.5;0.3];%第一种方法的初值(第一方法只需要用到三个变量)
y0 = [1;0.5;0.3;0.2];%初值
tspan = [0 5];
%===============================
%方法1:变量替换后用fsolve函数
%===============================
%将y(4)用y(1)+y(2)-y(3)-1代替
     function DyDt = DyDtNestedFun1(t,y)
        fun = @(dy)[dy(1)+0.3*y(1)+2*y(2)*sin(dy(3))+y(2)*(y(1)+y(2)-y(3)-1);
            dy(2)+y(2)+0.5*cos(dy(1)+y(3))+0.2*sin(0.6*t);
            dy(3)+0.2*y(1)*y(2)-exp(-dy(1))];
        options = optimset('display','off','TolX',1e-8,'TolFun',1e-8);
        %使用fsolve求解出与原问题对应的和y1',y2',y3'
        DyDt = fsolve(fun,y,options);%状态变量一阶微分值 
        end
[T1,Y1] = ode45(@DyDtNestedFun1,tspan,y01);
%===============================
%方法2:用ode15i函数
%===============================
%被ode15i调用的微分函数表达式
    function DyDt = DyDtNestedFun2(t,y,dy)
        DyDt = [dy(1)+0.3*y(1)+2*y(2)*sin(dy(3))+y(2)*y(4);
            dy(2)+y(2)+0.5*cos(dy(1)+y(3))+0.2*sin(0.6*t);
            dy(3)+0.2*y(1)*y(2)-exp(-dy(1));
            y(1)+y(2)-y(3)-y(4)-1];
    end
%y(1)+y(2)-y(3)-y(4)-1=0 表明y中任何一个改变后都会至少引起其余一个发生变化,因此
y0_fix = [0;1;0;0];%任意三位都可以改为0,比如[0;0;1;0]或者[1;0;0;0]等
%状态变量一阶微分初值,例子中没有提供,因此可以猜测一组值,可能需要猜测好几回才能保证
%不提示“Convergence failure in DECIC.”错误
dy0 = [-1;-1;2.5;0.5];
%该组初值都可以改变,故全部为0
dy0_fix = [0;0;0;0];
%时间变量的初值
t0 = 0;
%计算输入到ode15i解算器的dy以及dy3
[y00,dy00] = decic(@DyDtNestedFun2,0,y0,y0_fix,dy0,dy0_fix);
[T2,Y2] = ode15i(@DyDtNestedFun2,tspan,y00,dy00);
%=========================
%画图呈现三个方法计算结果
%=========================
figure;
%方法1得到的图
subplot(121);
plot(T1,Y1(:,1),'k-','linewidth',2);
hold on
plot(T1,Y1(:,2),'k-.','linewidth',2);
plot(T1,Y1(:,3),'k-*','linewidth',1);
plot(T1,Y1(:,1)+Y1(:,2)-Y1(:,3)-1,'k-o','linewidth',1);
hold off
%图例,位置自动选择最佳位置
L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)',...
    '{\ity}_4(t)','Location','best');
set(L,'fontname','Times New Roman');
xlabel('\itt','fontsize',16);title('方法1计算结果图')
%方法2得到的图
subplot(122);
plot(T2,Y2(:,1),'k-','linewidth',2);
hold on
plot(T2,Y2(:,2),'k-.','linewidth',2);
plot(T2,Y2(:,3),'k-*','linewidth',1);
plot(T2,Y2(:,4),'k-o','linewidth',1);
hold off
L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)',...
    '{\ity}_4(t)','Location','best');
set(L,'fontname','Times New Roman');
xlabel('\itt','fontsize',16);title('方法2计算结果图')
end